package com.yanqu.road.dao.impl.activity.dunhuangshiku;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.yanqu.road.dao.db.DbNameStrategy;
import com.yanqu.road.dao.db.DbParameter;
import com.yanqu.road.dao.impl.TempDataObjectDao;
import com.yanqu.road.entity.activity.dunhuangshiku.DunHuangShiKuEnemyInfo;
import com.yanqu.road.entity.activity.dunhuangshiku.DunHuangShiKuLeaveInfo;
import com.yanqu.road.entity.activity.dunhuangshiku.DunHuangShiKuUserData;
import com.yanqu.road.entity.player.UserBaseInfo;
import com.yanqu.road.utils.string.StringUtils;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description
 * @Author cwq
 * @Data 2021/4/19 14:15
 */
public class DunHuangShiKuUserDataDaoImpl  extends TempDataObjectDao<DunHuangShiKuUserData> {

    public static String getDunHuangShiKuUserDataSql = "select * from t_c_dunhuangshiku_user_data where activityId = ? and groupId = ?";
    public Map<Long, DunHuangShiKuUserData> getDunHuangShiKuUserData(long activityId, int groupId) {
        ResultSet rs = null;
        CallableStatement call = null;
        Map<Long,DunHuangShiKuUserData> map = new HashMap<>();
        try {
            getDb().setConnName(DbNameStrategy.getCross2Db());
            call = getDb().getConnection().prepareCall(getDunHuangShiKuUserDataSql);
            int i = 1;
            call.setLong(i++,activityId);
            call.setInt(i, groupId);
            rs = call.executeQuery();
            while (rs.next()) {
                DunHuangShiKuUserData dunHuangShiKuUserData = parse(rs);
                map.put(dunHuangShiKuUserData.getUserId(),dunHuangShiKuUserData);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);} finally {
            getDb().closeConnection(call, rs);
        }
        return map;
    }

    public static String updateDunHuangShiKuUserDataSql = "update t_c_dunhuangshiku_user_data set regionId=?,unlockRegionId=?,energy=?,energyLastTime=?,blood=?,remainBlood=?,attack=?,earn=?,curPatronsEarn=?,eventId=?,targetId=?,targetTotalBlood=?,attackStatus=?,lastAttackTime=?,teamId=?,allScore=?,bookNum=?,lastTimeLeaveTime=?,lastTimeCreateTime=?,muralBit=?,isEnter=?, " +
            "curKillNum=?,curRobBookNum=?,leaveInfo=?,enemyInfo=?,enemyInfoMap=?,applyJoinTeamMap=?,boxMap=?,finishEventMap=?,userBaseInfo=?,allEventNum = ?,helpTimes = ?,consumeEnergy = ? where activityId=? and serverId=? and userId=? and groupId=?";
    @Override
    protected boolean updateData(DunHuangShiKuUserData dunHuangShiKuUserData) {
        dunHuangShiKuUserData.setBeginWriteTime();
        getDb().setConnName(DbNameStrategy.getCross2Db());
        int i = 1;
        Map<Integer, DbParameter> para = new HashMap<Integer, DbParameter>();
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getRegionId()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getUnlockRegionId()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getEnergy()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getEnergyLastTime()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getBlood()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getRemainBlood()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getAttack()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getEarn()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getCurPatronsEarn()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getEventId()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getTargetId()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getTargetTotalBlood()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getAttackStatus()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getLastAttackTime()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getTeamId()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getAllScore()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getBookNum()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getLastTimeLeaveTime()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getLastTimeCreateTime()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getMuralBit()));
        para.put(i++, new DbParameter(Types.BOOLEAN, dunHuangShiKuUserData.isEnter()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getCurKillNum()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getCurRobBookNum()));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getLeaveInfo())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getEnemyInfo())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getEnemyInfoMap())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getApplyJoinTeamMap())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getBoxMap())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getFinishEventMap())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getUserBaseInfo())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getAllEventNumMap())));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getHelpTimes()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getConsumeEnergy()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getActivityId()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getServerId()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getUserId()));
        para.put(i, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getGroupId()));
        if (getDb().executeNoneQuery(updateDunHuangShiKuUserDataSql, para) > 0) {
            return true;
        }
        return false;
    }

    public static String insertDunHuangShiKuUserDataSql = "insert into t_c_dunhuangshiku_user_data(activityId,serverId,userId,regionId,unlockRegionId,energy,energyLastTime,blood,remainBlood,attack,earn,curPatronsEarn,eventId,targetId,targetTotalBlood,attackStatus, " +
            "lastAttackTime,teamId,allScore,bookNum,lastTimeLeaveTime,lastTimeCreateTime,muralBit,isEnter,curKillNum,curRobBookNum,leaveInfo,enemyInfo,enemyInfoMap,applyJoinTeamMap,boxMap,finishEventMap,userBaseInfo,allEventNum,helpTimes,consumeEnergy,groupId) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
    @Override
    protected boolean addData(DunHuangShiKuUserData dunHuangShiKuUserData) {
        dunHuangShiKuUserData.setBeginWriteTime();
        getDb().setConnName(DbNameStrategy.getCross2Db());
        int i = 1;
        Map<Integer, DbParameter> para = new HashMap<Integer, DbParameter>();
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getActivityId()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getServerId()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getUserId()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getRegionId()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getUnlockRegionId()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getEnergy()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getEnergyLastTime()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getBlood()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getRemainBlood()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getAttack()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getEarn()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getCurPatronsEarn()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getEventId()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getTargetId()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getTargetTotalBlood()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getAttackStatus()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getLastAttackTime()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getTeamId()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getAllScore()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getBookNum()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getLastTimeLeaveTime()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getLastTimeCreateTime()));
        para.put(i++, new DbParameter(Types.BIGINT, dunHuangShiKuUserData.getMuralBit()));
        para.put(i++, new DbParameter(Types.BOOLEAN, dunHuangShiKuUserData.isEnter()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getCurKillNum()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getCurRobBookNum()));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getLeaveInfo())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getEnemyInfo())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getEnemyInfoMap())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getApplyJoinTeamMap())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getBoxMap())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getFinishEventMap())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getUserBaseInfo())));
        para.put(i++, new DbParameter(Types.VARCHAR, JSON.toJSONString(dunHuangShiKuUserData.getAllEventNumMap())));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getHelpTimes()));
        para.put(i++, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getConsumeEnergy()));
        para.put(i, new DbParameter(Types.INTEGER, dunHuangShiKuUserData.getGroupId()));
        if (getDb().executeNoneQuery(insertDunHuangShiKuUserDataSql, para) > 0) {
            return true;
        }
        return false;
    }

    @Override
    protected DunHuangShiKuUserData parseData(ResultSet rs) throws SQLException {DunHuangShiKuUserData dunHuangShiKuUserData = new DunHuangShiKuUserData();
        dunHuangShiKuUserData.setActivityId(rs.getLong("activityId"));
        dunHuangShiKuUserData.setGroupId(rs.getInt("groupId"));
        dunHuangShiKuUserData.setServerId(rs.getLong("serverId"));
        dunHuangShiKuUserData.setUserId(rs.getLong("userId"));
        dunHuangShiKuUserData.setRegionId(rs.getInt("regionId"));
        dunHuangShiKuUserData.setUnlockRegionId(rs.getInt("unlockRegionId"));
        dunHuangShiKuUserData.setEnergy(rs.getInt("energy"));
        dunHuangShiKuUserData.setEnergyLastTime(rs.getLong("energyLastTime"));
        dunHuangShiKuUserData.setBlood(rs.getLong("blood"));
        dunHuangShiKuUserData.setRemainBlood(rs.getLong("remainBlood"));
        dunHuangShiKuUserData.setAttack(rs.getLong("attack"));
        dunHuangShiKuUserData.setEarn(rs.getLong("earn"));
        dunHuangShiKuUserData.setCurPatronsEarn(rs.getLong("curPatronsEarn"));
        dunHuangShiKuUserData.setEventId(rs.getInt("eventId"));
        dunHuangShiKuUserData.setTargetId(rs.getLong("targetId"));
        dunHuangShiKuUserData.setTargetTotalBlood(rs.getLong("targetTotalBlood"));
        dunHuangShiKuUserData.setAttackStatus(rs.getInt("attackStatus"));
        dunHuangShiKuUserData.setLastAttackTime(rs.getLong("lastAttackTime"));
        dunHuangShiKuUserData.setTeamId(rs.getInt("teamId"));
        dunHuangShiKuUserData.setAllScore(rs.getLong("allScore"));
        dunHuangShiKuUserData.setBookNum(rs.getInt("bookNum"));
        dunHuangShiKuUserData.setLastTimeLeaveTime(rs.getLong("lastTimeLeaveTime"));
        dunHuangShiKuUserData.setLastTimeCreateTime(rs.getLong("lastTimeCreateTime"));
        dunHuangShiKuUserData.setMuralBit(rs.getLong("muralBit"));
        dunHuangShiKuUserData.setIsEnter(rs.getBoolean("isEnter"));
        dunHuangShiKuUserData.setCurKillNum(rs.getInt("curKillNum"));
        dunHuangShiKuUserData.setCurRobBookNum(rs.getInt("curRobBookNum"));
        dunHuangShiKuUserData.setLeaveInfo(JSON.parseObject(rs.getString("leaveInfo"), new TypeReference<DunHuangShiKuLeaveInfo>() {}));
        dunHuangShiKuUserData.setEnemyInfo(JSON.parseObject(rs.getString("enemyInfo"), new TypeReference<DunHuangShiKuEnemyInfo>() {}));
        dunHuangShiKuUserData.setEnemyInfoMap(JSON.parseObject(rs.getString("enemyInfoMap"), new TypeReference<Map<Long, Integer>>() {}));
        dunHuangShiKuUserData.setApplyJoinTeamMap(JSON.parseObject(rs.getString("applyJoinTeamMap"), new TypeReference<Map<Integer, Long>>() {}));
        dunHuangShiKuUserData.setBoxMap(JSON.parseObject(rs.getString("boxMap"), new TypeReference<Map<Integer, Integer>>() {}));
        if (!StringUtils.isNullOrEmpty(rs.getString("finishEventMap"))) {
            dunHuangShiKuUserData.setFinishEventMap(JSON.parseObject(rs.getString("finishEventMap"), new TypeReference<Map<Integer, Integer>>() {}));
        }
        if (!StringUtils.isNullOrEmpty(rs.getString("allEventNum"))) {
            dunHuangShiKuUserData.setAllEventNumMap(JSON.parseObject(rs.getString("allEventNum"), new TypeReference<Map<Integer, Integer>>() {}));
        }
        UserBaseInfo userBaseInfo;
        String userBaseInfoStr = rs.getString("userBaseInfo");
        if (StringUtils.isNullOrEmpty(userBaseInfoStr)) {
            userBaseInfo = new UserBaseInfo();
        } else {
            userBaseInfo = JSON.parseObject(userBaseInfoStr, UserBaseInfo.class);
        }
        dunHuangShiKuUserData.setUserBaseInfo(userBaseInfo);
        dunHuangShiKuUserData.setHelpTimes(rs.getInt("helpTimes"));
        dunHuangShiKuUserData.setConsumeEnergy(rs.getInt("consumeEnergy"));
        return dunHuangShiKuUserData;
    }

}
